package cn.seecoder.ai.exception;

import cn.seecoder.ai.enums.ErrorCodeEnum;
import cn.seecoder.ai.enums.ParamTypeEnum;
import cn.seecoder.ai.enums.TrainParamEnum;
import cn.seecoder.ai.model.vo.ModelVO;
import lombok.Data;

import java.util.List;

/**
 *
 * @author fanyanpeng
 * @date 2023/4/8 2:49
 */

@Data
public class AIExternalException extends RuntimeException{


    private String message;
    private ErrorCodeEnum errorCodeEnum;
    public AIExternalException(String message){
        this.message=message;
    }
    public AIExternalException(ErrorCodeEnum errorCodeEnum){
        this.errorCodeEnum=errorCodeEnum;
    }



    public static AIExternalException userNameNotFound(){
        return new AIExternalException("用户名不存在");
    }
    public static AIExternalException userNameOrPasswordWrong(){
        return new AIExternalException("用户名或者密码错误");
    }

    public static AIExternalException userNameAlreadyExist(){
        return new AIExternalException("用户名已存在");
    }

    public static AIExternalException organizationNameNotNull(){
        return new AIExternalException("组织信息不为空");
    }

    public static AIExternalException fileNameAlreadyExistForThisUser(){
        return new AIExternalException("当前用户下已经存在同名文件");
    }

    public static AIExternalException fileNotFoundByFileInfoId(){
        return new AIExternalException("文件未找到");
    }

    public static AIExternalException fileTypeNotSupported(){
        return new AIExternalException("文件类型不支持，请上传csv文件");
    }

    public static AIExternalException configNotFoundByConfigId(){
        return new AIExternalException("配置未找到");
    }

    public static AIExternalException modelRelyOnThisConfig(){
        return new AIExternalException("配置无法删除：有模型使用该配置");
    }

    public static AIExternalException trainParamsCountNotMatch(){
        return new AIExternalException("输入机器学习算法参数与要求不匹配");
    }

    public static AIExternalException trainParamNotSet(TrainParamEnum trainParamEnum){
        return new AIExternalException("机器学习算法参数未设定: "+trainParamEnum.getSelf());
    }

    public static AIExternalException trainParamOutOfRange(Object left, Object right, Object value, String paramName) {
        return new AIExternalException(String.format("机器学习算法参数超出范围，value is "+value+", but for "+paramName+", range is ("+left+","+right+")"));
    }

    public static AIExternalException trainParamCastFailed(Object value, String type) {
        return new AIExternalException("训练参数转换出错，需要类型："+type+", 实际传入数据"+value.toString());
    }

    public static AIExternalException trainParamTypeNotSettled(ParamTypeEnum paramType) {
        return new AIExternalException("该参数类型对应类型没有处理方案"+paramType.toString());
    }

    public static AIExternalException modelNotFoundById(Integer modelId) {
        return new AIExternalException(String.format("模型未找到，modelId={}",modelId));
    }

    public static AIExternalException columnsNotExist(){
        return new AIExternalException("选择使用的文件有误，不包含期望的特征列");
    }

    public static AIExternalException columnsTypeWrong(){
        return new AIExternalException("选择了错误的特征类型");
    }

    public static AIExternalException columnsNumberWrong(){
        return new AIExternalException("选择了错误的特征数量");
    }

    public static AIExternalException machineLearningAlgorithmTypeNotFound(){
        return new AIExternalException("选中的机器学习算法没有找到算法类型");
    }

    public static AIExternalException machineLearningAlgorithmNotMapped(){
        return new AIExternalException("选中的机器学习算法没有找到在该类型下找到");
    }

    public static AIExternalException pipeLineSaveToHdfsFailed(){
        return new AIExternalException("流水线模型保存失败");
    }

    public static AIExternalException predictionNotFound(){
        return new AIExternalException("预测结果未找到");
    }


    public static AIExternalException noSuchDeployment(Integer deploymentId) {
        return new AIExternalException("未找到该部署，deploymentId="+deploymentId);
    }


    public static AIExternalException regressionLabelMustBeNumber() {
        return new AIExternalException("回归算法的标签必须数值型");
    }

    public static AIExternalException trainPrammNumberFormatException(Object value, String type) {
        return new AIExternalException("训练参数转换出错，格式不符合："+type+", 实际传入数据"+value.toString());
    }


    public static AIExternalException trainSetAndTestSetDataTypeMismatched(){
        return new AIExternalException("训练集和测试集数据类型不匹配");
    }

    public static AIExternalException predictFileStructureNotMatchTrainFileStructure() {
        return new AIExternalException("训练集和预测集数据类型不匹配");
    }
}
